package Demo13;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;

/**
 * 水果成篮
 * https://leetcode.cn/problems/fruit-into-baskets/
 * 这里也是使用双指针
 * 维护一个left right 还有一个计数器
 * 一个使用数组来做容器,一个使用hashMap来作为容器
 * hashMap作为容器,需要的时间更高
 */

class Solution {
    public int totalFruit(int[] fruits) {
       int n = fruits.length,ret = -1;
       int[] tmp = new int[n];
       for(int left = 0,count = 0,right = 0;right < n;right++) {
           if(tmp[fruits[right]] == 0) count++;// 统计水果种类
           tmp[fruits[right]] ++;// 进窗口
           while(count > 2) {// 判断
               tmp[fruits[left]]--;// 出窗口
               if(tmp[fruits[left]] == 0) count--;
               left++;
           }
           ret = Math.max(ret,right - left + 1);// 更新值
       }
       return ret;
    }
    public int totalFruit1(int[] fruits) {
        Map<Integer,Integer> hash = new HashMap<>();
        int ret = 0;
        for(int left = 0,right = 0;right < fruits.length;right++) {
            int in = fruits[right];
            hash.put(in,hash.getOrDefault(in,0) + 1);// 进窗口
            while(hash.size() > 2) {
                int out = fruits[left];
                hash.put(out,hash.get(out) - 1);
                if(hash.get(out) == 0) {
                    hash.remove(out);
                }
                left++;
            }
            ret = Math.max(ret,right - left + 1);
        }
        return ret;
    }
}
class Demo {
    public static void main(String[] args) {
        Solution solution = new Solution();
        int ret = solution.totalFruit(new int[] {3,3,3,1,2,1,1,2,3,3,4});
        System.out.println(ret);
    }
}